<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Intervals query | Elasticsearch Guide [7.7] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch Guide [7.7]">
<link rel="up" href="full-text-queries.html" title="Full text queries">
<link rel="prev" href="full-text-queries.html" title="Full text queries">
<link rel="next" href="query-dsl-match-query.html" title="Match query">
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Reference/7.7">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="7.7">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<strong>IMPORTANT</strong>: No additional bug fixes or documentation updates
will be released for this version. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="query-dsl.html">Query DSL</a></span>
»
<span class="breadcrumb-link"><a href="full-text-queries.html">Full text queries</a></span>
»
<span class="breadcrumb-node">Intervals query</span>
</div>
<div class="navheader">
<span class="prev">
<a href="full-text-queries.html">« Full text queries</a>
</span>
<span class="next">
<a href="query-dsl-match-query.html">Match query »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="query-dsl-intervals-query"></a>Intervals query<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h2>
</div></div></div>

<p>Returns documents based on the order and proximity of matching terms.</p>
<p>The <code class="literal">intervals</code> query uses <span class="strong strong"><strong>matching rules</strong></span>, constructed from a small set of
definitions. These rules are then applied to terms from a specified <code class="literal">field</code>.</p>
<p>The definitions produce sequences of minimal intervals that span terms in a
body of text. These intervals can be further combined and filtered by
parent sources.</p>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-query-ex-request"></a>Example request<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The following <code class="literal">intervals</code> search returns documents containing <code class="literal">my
favorite food</code> immediately followed by <code class="literal">hot water</code> or <code class="literal">cold porridge</code> in the
<code class="literal">my_text</code> field.</p>
<p>This search would match a <code class="literal">my_text</code> value of <code class="literal">my favorite food is cold
porridge</code> but not <code class="literal">when it's cold my favorite food is porridge</code>.</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "all_of" : {
          "ordered" : true,
          "intervals" : [
            {
              "match" : {
                "query" : "my favorite food",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "hot water" } },
                  { "match" : { "query" : "cold porridge" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/108.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-top-level-params"></a>Top-level parameters for <code class="literal">intervals</code><a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<div class="variablelist">
<a id="intervals-rules"></a>
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">&lt;field&gt;</code>
</span>
</dt>
<dd>
<p>(Required, rule object) Field you wish to search.</p>
<p>The value of this parameter is a rule object used to match documents
based on matching terms, order, and proximity.</p>
<p>Valid rules include:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<a class="xref" href="query-dsl-intervals-query.html#intervals-match" title="match rule parameters"><code class="literal">match</code></a>
</li>
<li class="listitem">
<a class="xref" href="query-dsl-intervals-query.html#intervals-prefix" title="prefix rule parameters"><code class="literal">prefix</code></a>
</li>
<li class="listitem">
<a class="xref" href="query-dsl-intervals-query.html#intervals-wildcard" title="wildcard rule parameters"><code class="literal">wildcard</code></a>
</li>
<li class="listitem">
<a class="xref" href="query-dsl-intervals-query.html#intervals-fuzzy" title="fuzzy rule parameters"><code class="literal">fuzzy</code></a>
</li>
<li class="listitem">
<a class="xref" href="query-dsl-intervals-query.html#intervals-all_of" title="all_of rule parameters"><code class="literal">all_of</code></a>
</li>
<li class="listitem">
<a class="xref" href="query-dsl-intervals-query.html#intervals-any_of" title="any_of rule parameters"><code class="literal">any_of</code></a>
</li>
</ul>
</div>
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-match"></a><code class="literal">match</code> rule parameters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">match</code> rule matches analyzed text.</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">query</code>
</span>
</dt>
<dd>
(Required, string) Text you wish to find in the provided <code class="literal">&lt;field&gt;</code>.
</dd>
<dt>
<span class="term">
<code class="literal">max_gaps</code>
</span>
</dt>
<dd>
<p>(Optional, integer) Maximum number of positions between the matching terms.
Terms further apart than this are not considered matches. Defaults to
<code class="literal">-1</code>.</p>
<p>If unspecified or set to <code class="literal">-1</code>, there is no width restriction on the match. If
set to <code class="literal">0</code>, the terms must appear next to each other.</p>
</dd>
<dt>
<span class="term">
<code class="literal">ordered</code>
</span>
</dt>
<dd>
(Optional, boolean)
If <code class="literal">true</code>, matching terms must appear in their specified order. Defaults to
<code class="literal">false</code>.
</dd>
<dt>
<span class="term">
<code class="literal">analyzer</code>
</span>
</dt>
<dd>
(Optional, string) <a class="xref" href="analysis.html" title="Text analysis">analyzer</a> used to analyze terms in the <code class="literal">query</code>.
Defaults to the top-level <code class="literal">&lt;field&gt;</code>'s analyzer.
</dd>
<dt>
<span class="term">
<code class="literal">filter</code>
</span>
</dt>
<dd>
(Optional, <a class="xref" href="query-dsl-intervals-query.html#interval_filter" title="filter rule parameters">interval filter</a> rule object) An optional interval
filter.
</dd>
<dt>
<span class="term">
<code class="literal">use_field</code>
</span>
</dt>
<dd>
(Optional, string) If specified, then match intervals from this
field rather than the top-level <code class="literal">&lt;field&gt;</code>. Terms are analyzed using the
search analyzer from this field. This allows you to search across multiple
fields as if they were all the same field; for example, you could index the same
text into stemmed and unstemmed fields, and search for stemmed tokens near
unstemmed ones.
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-prefix"></a><code class="literal">prefix</code> rule parameters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">prefix</code> rule matches terms that start with a specified set of characters.
This prefix can expand to match at most 128 terms. If the prefix matches more
than 128 terms, Elasticsearch returns an error. You can use the
<a class="xref" href="index-prefixes.html" title="index_prefixes"><code class="literal">index-prefixes</code></a> option in the field mapping to avoid this
limit.</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">prefix</code>
</span>
</dt>
<dd>
(Required, string) Beginning characters of terms you wish to find in the
top-level <code class="literal">&lt;field&gt;</code>.
</dd>
<dt>
<span class="term">
<code class="literal">analyzer</code>
</span>
</dt>
<dd>
(Optional, string) <a class="xref" href="analysis.html" title="Text analysis">analyzer</a> used to normalize the <code class="literal">prefix</code>.
Defaults to the top-level <code class="literal">&lt;field&gt;</code>'s analyzer.
</dd>
<dt>
<span class="term">
<code class="literal">use_field</code>
</span>
</dt>
<dd>
<p>(Optional, string) If specified, then match intervals from this field rather
than the top-level <code class="literal">&lt;field&gt;</code>.</p>
<p>The <code class="literal">prefix</code> is normalized using the search analyzer from this field, unless a
separate <code class="literal">analyzer</code> is specified.</p>
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-wildcard"></a><code class="literal">wildcard</code> rule parameters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">wildcard</code> rule matches terms using a wildcard pattern. This pattern can
expand to match at most 128 terms. If the pattern matches more than 128 terms,
Elasticsearch returns an error.</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">pattern</code>
</span>
</dt>
<dd>
<p>
(Required, string) Wildcard pattern used to find matching terms.
</p>
<p>This parameter supports two wildcard operators:</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">?</code>, which matches any single character
</li>
<li class="listitem">
<code class="literal">*</code>, which can match zero or more characters, including an empty one
</li>
</ul>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>Avoid beginning patterns with <code class="literal">*</code> or <code class="literal">?</code>. This can increase
the iterations needed to find matching terms and slow search performance.</p>
</div>
</div>
</dd>
<dt>
<span class="term">
<code class="literal">analyzer</code>
</span>
</dt>
<dd>
(Optional, string) <a class="xref" href="analysis.html" title="Text analysis">analyzer</a> used to normalize the <code class="literal">pattern</code>.
Defaults to the top-level <code class="literal">&lt;field&gt;</code>'s analyzer.
</dd>
<dt>
<span class="term">
<code class="literal">use_field</code>
</span>
</dt>
<dd>
<p>(Optional, string) If specified, match intervals from this field rather than the
top-level <code class="literal">&lt;field&gt;</code>.</p>
<p>The <code class="literal">pattern</code> is normalized using the search analyzer from this field, unless
<code class="literal">analyzer</code> is specified separately.</p>
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-fuzzy"></a><code class="literal">fuzzy</code> rule parameters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">fuzzy</code> rule matches terms that are similar to the provided term, within an
edit distance defined by <a class="xref" href="common-options.html#fuzziness" title="Fuzziness">Fuzziness</a>.  If the fuzzy expansion matches more than
128 terms, Elasticsearch returns an error.</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">term</code>
</span>
</dt>
<dd>
(Required, string) The term to match
</dd>
<dt>
<span class="term">
<code class="literal">prefix_length</code>
</span>
</dt>
<dd>
(Optional, integer) Number of beginning characters left unchanged when creating
expansions. Defaults to <code class="literal">0</code>.
</dd>
<dt>
<span class="term">
<code class="literal">transpositions</code>
</span>
</dt>
<dd>
(Optional, boolean) Indicates whether edits include transpositions of two
adjacent characters (ab → ba). Defaults to <code class="literal">true</code>.
</dd>
<dt>
<span class="term">
<code class="literal">fuzziness</code>
</span>
</dt>
<dd>
(Optional, string) Maximum edit distance allowed for matching. See <a class="xref" href="common-options.html#fuzziness" title="Fuzziness">Fuzziness</a>
for valid values and more information.  Defaults to <code class="literal">auto</code>.
</dd>
<dt>
<span class="term">
<code class="literal">analyzer</code>
</span>
</dt>
<dd>
(Optional, string) <a class="xref" href="analysis.html" title="Text analysis">analyzer</a> used to normalize the <code class="literal">term</code>.
Defaults to the top-level <code class="literal">&lt;field&gt;</code> 's analyzer.
</dd>
<dt>
<span class="term">
<code class="literal">use_field</code>
</span>
</dt>
<dd>
<p>(Optional, string) If specified, match intervals from this field rather than the
top-level <code class="literal">&lt;field&gt;</code>.</p>
<p>The <code class="literal">term</code> is normalized using the search analyzer from this field, unless
<code class="literal">analyzer</code> is specified separately.</p>
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-all_of"></a><code class="literal">all_of</code> rule parameters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">all_of</code> rule returns matches that span a combination of other rules.</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">intervals</code>
</span>
</dt>
<dd>
(Required, array of rule objects) An array of rules to combine. All rules must
produce a match in a document for the overall source to match.
</dd>
<dt>
<span class="term">
<code class="literal">max_gaps</code>
</span>
</dt>
<dd>
<p>(Optional, integer) Maximum number of positions between the matching terms.
Intervals produced by the rules further apart than this are not considered
matches. Defaults to <code class="literal">-1</code>.</p>
<p>If unspecified or set to <code class="literal">-1</code>, there is no width restriction on the match. If
set to <code class="literal">0</code>, the terms must appear next to each other.</p>
</dd>
<dt>
<span class="term">
<code class="literal">ordered</code>
</span>
</dt>
<dd>
(Optional, boolean) If <code class="literal">true</code>, intervals produced by the rules should appear in
the order in which they are specified. Defaults to <code class="literal">false</code>.
</dd>
<dt>
<span class="term">
<code class="literal">filter</code>
</span>
</dt>
<dd>
(Optional, <a class="xref" href="query-dsl-intervals-query.html#interval_filter" title="filter rule parameters">interval filter</a> rule object) Rule used to filter
returned intervals.
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-any_of"></a><code class="literal">any_of</code> rule parameters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">any_of</code> rule returns intervals produced by any of its sub-rules.</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">intervals</code>
</span>
</dt>
<dd>
(Required, array of rule objects) An array of rules to match.
</dd>
<dt>
<span class="term">
<code class="literal">filter</code>
</span>
</dt>
<dd>
(Optional, <a class="xref" href="query-dsl-intervals-query.html#interval_filter" title="filter rule parameters">interval filter</a> rule object) Rule used to filter
returned intervals.
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="interval_filter"></a><code class="literal">filter</code> rule parameters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<p>The <code class="literal">filter</code> rule returns intervals based on a query. See
<a class="xref" href="query-dsl-intervals-query.html#interval-filter-rule-ex" title="Filter example">Filter example</a> for an example.</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">after</code>
</span>
</dt>
<dd>
(Optional, query object) Query used to return intervals that follow an interval
from the <code class="literal">filter</code> rule.
</dd>
<dt>
<span class="term">
<code class="literal">before</code>
</span>
</dt>
<dd>
(Optional, query object) Query used to return intervals that occur before an
interval from the <code class="literal">filter</code> rule.
</dd>
<dt>
<span class="term">
<code class="literal">contained_by</code>
</span>
</dt>
<dd>
(Optional, query object) Query used to return intervals contained by an interval
from the <code class="literal">filter</code> rule.
</dd>
<dt>
<span class="term">
<code class="literal">containing</code>
</span>
</dt>
<dd>
(Optional, query object) Query used to return intervals that contain an interval
from the <code class="literal">filter</code> rule.
</dd>
<dt>
<span class="term">
<code class="literal">not_contained_by</code>
</span>
</dt>
<dd>
(Optional, query object) Query used to return intervals that are <span class="strong strong"><strong>not</strong></span>
contained by an interval from the <code class="literal">filter</code> rule.
</dd>
<dt>
<span class="term">
<code class="literal">not_containing</code>
</span>
</dt>
<dd>
(Optional, query object) Query used to return intervals that do <span class="strong strong"><strong>not</strong></span> contain
an interval from the <code class="literal">filter</code> rule.
</dd>
<dt>
<span class="term">
<code class="literal">not_overlapping</code>
</span>
</dt>
<dd>
(Optional, query object) Query used to return intervals that do <span class="strong strong"><strong>not</strong></span> overlap
with an interval from the <code class="literal">filter</code> rule.
</dd>
<dt>
<span class="term">
<code class="literal">overlapping</code>
</span>
</dt>
<dd>
(Optional, query object) Query used to return intervals that overlap with an
interval from the <code class="literal">filter</code> rule.
</dd>
<dt>
<span class="term">
<code class="literal">script</code>
</span>
</dt>
<dd>
(Optional, <a class="xref" href="modules-scripting-using.html" title="How to use scripts">script object</a>) Script used to return
matching documents. This script must return a boolean value, <code class="literal">true</code> or <code class="literal">false</code>.
See <a class="xref" href="query-dsl-intervals-query.html#interval-script-filter" title="Script filters">Script filters</a> for an example.
</dd>
</dl>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="intervals-query-note"></a>Notes<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h3>
</div></div></div>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="interval-filter-rule-ex"></a>Filter example<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h4>
</div></div></div>
<p>The following search includes a <code class="literal">filter</code> rule. It returns documents that have
the words <code class="literal">hot</code> and <code class="literal">porridge</code> within 10 positions of each other, without the
word <code class="literal">salty</code> in between:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "hot porridge",
          "max_gaps" : 10,
          "filter" : {
            "not_containing" : {
              "match" : {
                "query" : "salty"
              }
            }
          }
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/109.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="interval-script-filter"></a>Script filters<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h4>
</div></div></div>
<p>You can use a script to filter intervals based on their start position, end
position, and internal gap count. The following <code class="literal">filter</code> script uses the
<code class="literal">interval</code> variable with the <code class="literal">start</code>, <code class="literal">end</code>, and <code class="literal">gaps</code> methods:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "hot porridge",
          "filter" : {
            "script" : {
              "source" : "interval.start &gt; 10 &amp;&amp; interval.end &lt; 20 &amp;&amp; interval.gaps == 0"
            }
          }
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/110.console"></div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="interval-minimization"></a>Minimization<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/query-dsl/intervals-query.asciidoc">edit</a>
</h4>
</div></div></div>
<p>The intervals query always minimizes intervals, to ensure that queries can
run in linear time. This can sometimes cause surprising results, particularly
when using <code class="literal">max_gaps</code> restrictions or filters. For example, take the
following query, searching for <code class="literal">salty</code> contained within the phrase <code class="literal">hot
porridge</code>:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "match" : {
          "query" : "salty",
          "filter" : {
            "contained_by" : {
              "match" : {
                "query" : "hot porridge"
              }
            }
          }
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/111.console"></div>
<p>This query does <span class="strong strong"><strong>not</strong></span> match a document containing the phrase <code class="literal">hot porridge is
salty porridge</code>, because the intervals returned by the match query for <code class="literal">hot
porridge</code> only cover the initial two terms in this document, and these do not
overlap the intervals covering <code class="literal">salty</code>.</p>
<p>Another restriction to be aware of is the case of <code class="literal">any_of</code> rules that contain
sub-rules which overlap. In particular, if one of the rules is a strict
prefix of the other, then the longer rule can never match, which can
cause surprises when used in combination with <code class="literal">max_gaps</code>. Consider the
following query, searching for <code class="literal">the</code> immediately followed by <code class="literal">big</code> or <code class="literal">big bad</code>,
immediately followed by <code class="literal">wolf</code>:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "all_of" : {
          "intervals" : [
            { "match" : { "query" : "the" } },
            { "any_of" : {
                "intervals" : [
                    { "match" : { "query" : "big" } },
                    { "match" : { "query" : "big bad" } }
                ] } },
            { "match" : { "query" : "wolf" } }
          ],
          "max_gaps" : 0,
          "ordered" : true
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/112.console"></div>
<p>Counter-intuitively, this query does <span class="strong strong"><strong>not</strong></span> match the document <code class="literal">the big bad
wolf</code>, because the <code class="literal">any_of</code> rule in the middle only produces intervals
for <code class="literal">big</code> - intervals for <code class="literal">big bad</code> being longer than those for <code class="literal">big</code>, while
starting at the same position, and so being minimized away. In these cases,
it’s better to rewrite the query so that all of the options are explicitly
laid out at the top level:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "any_of" : {
          "intervals" : [
            { "match" : {
                "query" : "the big bad wolf",
                "ordered" : true,
                "max_gaps" : 0 } },
            { "match" : {
                "query" : "the big wolf",
                "ordered" : true,
                "max_gaps" : 0 } }
           ]
        }
      }
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/113.console"></div>
</div>

</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="full-text-queries.html">« Full text queries</a>
</span>
<span class="next">
<a href="query-dsl-match-query.html">Match query »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
